This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

## Prepare dataset
Info = RawMCDI[,c(7,8,18)]
Info
Questions = RawMCDI[,26:421]
Questions
questionsBool = Questions[-c(1,2),]
questionsBool = questionsBool!=""
questionsBool
   Q21_1 Q21_2 Q21_3 Q21_4 Q21_5 Q21_6 Q21_7 Q21_8 Q21_9 Q21_10 Q21_11 Q21_12 Q23_1 Q23_2 Q23_3 Q23_4 Q23_5 Q23_6 Q23_7 Q23_8 Q23_9
3  FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE   TRUE   TRUE   TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE
4  FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  FALSE  FALSE  FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
   Q23_10 Q23_11 Q23_12 Q23_13 Q23_14 Q23_15 Q23_16 Q23_17 Q23_18 Q23_19 Q23_20 Q23_21 Q23_22 Q23_23 Q23_24 Q23_25 Q23_26 Q23_27
3    TRUE  FALSE   TRUE  FALSE   TRUE   TRUE   TRUE  FALSE   TRUE  FALSE   TRUE   TRUE  FALSE   TRUE   TRUE  FALSE   TRUE  FALSE
4   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
   Q23_28 Q23_29 Q23_30 Q23_31 Q23_32 Q23_33 Q23_34 Q23_35 Q23_36 Q25_1 Q25_2 Q25_3 Q25_4 Q25_5 Q25_6 Q25_7 Q25_8 Q25_9 Q27_1 Q27_2
3   FALSE  FALSE   TRUE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
4   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
   Q27_3 Q27_4 Q27_5 Q27_6 Q27_7 Q27_8 Q29_1 Q29_2 Q29_3 Q29_4 Q29_5 Q29_6 Q29_7 Q29_8 Q29_9 Q29_10 Q29_11 Q29_12 Q29_13 Q29_14 Q29_15
3   TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE   TRUE  FALSE  FALSE  FALSE   TRUE
4  FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
   Q29_16 Q29_17 Q29_18 Q29_19 Q29_20 Q29_21 Q29_22 Q29_23 Q29_24 Q29_25 Q29_26 Q29_27 Q29_28 Q29_29 Q29_30 Q31_1 Q31_2 Q31_3 Q31_4
3   FALSE  FALSE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE FALSE  TRUE FALSE FALSE
4   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE FALSE FALSE FALSE FALSE
   Q31_5 Q31_6 Q31_7 Q31_8 Q31_9 Q31_10 Q31_11 Q31_12 Q31_13 Q31_14 Q31_15 Q31_16 Q31_17 Q31_18 Q31_19 Q32_1 Q32_2 Q32_3 Q32_4 Q32_5
3  FALSE  TRUE FALSE  TRUE FALSE  FALSE  FALSE   TRUE   TRUE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE FALSE  TRUE  TRUE FALSE  TRUE
4  FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE FALSE FALSE FALSE FALSE FALSE
   Q32_6 Q32_7 Q32_8 Q32_9 Q32_10 Q32_11 Q32_12 Q32_13 Q32_14 Q32_15 Q32_16 Q32_17 Q32_18 Q32_19 Q32_20 Q34_1 Q34_2 Q34_3 Q34_4 Q34_5
3   TRUE  TRUE  TRUE FALSE   TRUE   TRUE  FALSE   TRUE   TRUE   TRUE   TRUE  FALSE  FALSE  FALSE   TRUE FALSE  TRUE  TRUE FALSE FALSE
4  FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE FALSE FALSE FALSE FALSE FALSE
   Q34_6 Q34_7 Q34_8 Q34_9 Q34_10 Q34_11 Q34_12 Q34_13 Q34_14 Q34_15 Q34_16 Q34_17 Q34_18 Q34_19 Q34_20 Q34_21 Q34_22 Q34_23 Q34_24
3  FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE   TRUE  FALSE
4  FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
   Q35_1 Q35_2 Q35_3 Q35_4 Q35_5 Q35_6 Q35_7 Q35_8 Q35_9 Q35_10 Q35_11 Q35_12 Q35_13 Q35_14 Q35_15 Q35_16 Q35_17 Q35_18 Q35_19 Q35_20
3   TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE
4  FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
   Q35_21 Q35_22 Q35_23 Q35_24 Q35_25 Q35_26 Q35_27 Q35_28 Q35_29 Q35_30 Q35_31 Q35_32 Q35_33 Q35_34 Q35_35 Q35_36 Q36_1 Q36_2 Q36_3
3   FALSE  FALSE   TRUE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE   TRUE  FALSE   TRUE   TRUE  FALSE FALSE FALSE  TRUE
4   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE FALSE FALSE FALSE
   Q36_4 Q36_5 Q36_6 Q36_7 Q36_8 Q36_9 Q36_10 Q36_11 Q36_12 Q36_13 Q36_14 Q36_15 Q36_16 Q36_17 Q36_18 Q36_19 Q36_20 Q36_21 Q36_22
3  FALSE FALSE  TRUE FALSE FALSE  TRUE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE   TRUE
4  FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE  FALSE
   Q36_23 Q36_24 Q36_25 Q36_26 Q36_27 Q37_1 Q37_2 Q37_3 Q37_4 Q37_5 Q37_6 Q37_7 Q37_8 Q37_9 Q37_10 Q37_11 Q37_12 Q37_13 Q37_14 Q37_15
3   FALSE  FALSE  FALSE  FALSE  FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE   TRUE   TRUE  FALSE  FALSE   TRUE   TRUE
4   FALSE  FALSE  FALSE  FALSE  FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE   TRUE  FALSE  FALSE  FALSE   TRUE   TRUE
   Q37_16 Q37_17 Q37_18 Q37_19 Q37_20 Q39_1 Q39_2 Q39_3 Q39_4 Q39_5 Q39_6 Q39_7 Q39_8 Q39_9 Q39_10 Q39_11 Q39_12 Q39_13 Q39_14 Q39_15
3   FALSE  FALSE   TRUE  FALSE  FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE   TRUE  FALSE  FALSE  FALSE  FALSE  FALSE
4   FALSE  FALSE  FALSE  FALSE  FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE   TRUE  FALSE   TRUE   TRUE  FALSE  FALSE
   Q39_16 Q39_17 Q39_18 Q39_19 Q40_1 Q40_2 Q40_3 Q40_4 Q40_5 Q40_6 Q40_7 Q40_8 Q40_9 Q40_10 Q40_11 Q40_12 Q40_13 Q40_14 Q40_15 Q40_16
3    TRUE   TRUE  FALSE   TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  FALSE   TRUE  FALSE   TRUE  FALSE  FALSE   TRUE
4   FALSE  FALSE  FALSE  FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
   Q40_17 Q40_18 Q40_19 Q40_20 Q40_21 Q40_22 Q40_23 Q40_24 Q40_25 Q40_26 Q40_27 Q40_28 Q40_29 Q40_30 Q40_31 Q40_32 Q40_33 Q40_34
3   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE   TRUE  FALSE   TRUE  FALSE  FALSE
4   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
   Q40_35 Q40_36 Q40_37 Q40_38 Q40_39 Q40_40 Q40_41 Q40_42 Q40_43 Q40_44 Q40_45 Q40_46 Q40_47 Q40_48 Q40_49 Q40_50 Q40_51 Q40_52
3   FALSE  FALSE  FALSE   TRUE  FALSE  FALSE   TRUE   TRUE   TRUE   TRUE  FALSE  FALSE  FALSE  FALSE   TRUE   TRUE   TRUE  FALSE
4   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE
   Q40_53 Q40_54 Q40_55 Q42_1 Q42_2 Q42_3 Q42_4 Q42_5 Q42_6 Q42_7 Q42_8 Q43_1 Q43_2 Q43_3 Q43_4 Q43_5 Q43_6 Q43_7 Q43_8 Q43_9 Q43_10
3   FALSE  FALSE  FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE  FALSE
4   FALSE  FALSE  FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE
   Q43_11 Q43_12 Q43_13 Q43_14 Q43_15 Q43_16 Q43_17 Q43_18 Q43_19 Q43_20 Q43_21 Q43_22 Q43_23 Q43_24 Q43_25 Q43_26 Q43_27 Q43_28
3    TRUE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE   TRUE   TRUE  FALSE   TRUE   TRUE  FALSE  FALSE   TRUE  FALSE  FALSE  FALSE
4   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE
   Q43_29 Q43_30 Q43_31 Q43_32 Q43_33 Q43_34 Q43_35 Q43_36 Q43_37 Q44_1 Q44_2 Q44_3 Q44_4 Q44_5 Q44_6 Q44_7 Q44_8 Q44_9 Q44_10 Q44_11
3   FALSE  FALSE  FALSE  FALSE  FALSE   TRUE   TRUE  FALSE   TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE   TRUE  FALSE
4   FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE  FALSE   TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE
   Q45_1 Q45_2 Q45_3 Q45_4 Q45_5 Q45_6 Q46_1 Q46_2 Q46_3 Q46_4 Q46_5 Q46_6 Q46_7 Q46_8 Q46_9 Q46_10 Q46_11 Q47_1 Q47_2 Q47_3 Q47_4
3  FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  FALSE   TRUE FALSE FALSE FALSE  TRUE
4  FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE  FALSE FALSE FALSE FALSE FALSE
   Q47_5 Q47_6 Q47_7 Q47_8
3  FALSE FALSE FALSE FALSE
4  FALSE FALSE FALSE FALSE
 [ reached getOption("max.print") -- omitted 18 rows ]
babyCodes = RawMCDI$Q2[-c(1,2)]
babyCodes
 [1] "idec04" "SD102"  "SD107"  "SD114"  "SD118"  "SD108"  "SD110"  "SD120"  "SD126"  "SD127"  "SD129"  "sd124"  "SD133"  "SD130" 
[15] "SD105"  "SD137"  "SD138"  "SD139"  "SD140"  "SD141" 
#Questions
# Reassemble dataset
Data = cbind(Info, Questions)
Data
# Delete redundant row of extra labels
Data = Data[-1,]
Data
# Change to Boolean
colnames(Data) = Data[1,]
Data = Data[-1,]
Data[,4:length(Data)] = Data[,4:length(Data)]!=""
Data
Objects = Data[,-c(1:3)]
rownames(Objects)=Data$Participant_ID
Objects
Objects = Objects[ , order(names(Objects))]
rownames(Objects)[1] = 'SD104'
rownames(Objects)[12] = 'SD124'
Objects = Objects[order(rownames(Objects)),]
Objects
study_babies = c('SD102', 'SD107', 'SD108', 'SD114', 'SD118', 'SD120', 'SD124', 'SD126', 'SD127', 'SD130', 'SD133', 'SD138', 'SD141', 'SD139')
getBabies = rownames(Objects)%in%study_babies
Objects_study_babies = Objects[getBabies,]
Objects_study_babies
Data_studybabies = Data
old_colnames = colnames(Data_studybabies)
colnames(Data_studybabies) = Data_studybabies[1,]
colnames(Data_studybabies)[3] = 'ID'
Data_studybabies[2,3] = 'SD104'
Data_studybabies=Data_studybabies[-1,]
Data_studybabies= Data_studybabies[order(Data_studybabies$ID),]
Data_studybabies
Data_studybabies[10,3] = 'SD124'
Data_studybabies
# Get relevant babies
babies = c('SD102', 'SD107', 'SD108', 'SD114', 'SD118', 'SD120', 'SD124', 'SD126', 'SD127', 'SD130', 'SD133', 'SD138', 'SD141', 'SD139')
get_babies = Data_studybabies$ID%in%babies
Data_studybabies= Data_studybabies[!get_babies,]
rownames(Data_studybabies)=c(1:14)
Error in `.rowNamesDF<-`(x, value = value) : invalid 'row.names' length
baby1 = colnames(Objects_study_babies)[as.logical(Objects_study_babies[12,])]
baby1=sort(baby1)
baby1
 [1] "airplane"            "apple"               "baby"                "ball"                "balloon"            
 [6] "banana"              "bird"                "book"                "bottle"              "brother"            
[11] "bubbles"             "bus"                 "bye"                 "child's_own_name"    "choo_choo"          
[16] "cry"                 "cup"                 "daddy"               "diaper"              "dog"                
[21] "egg"                 "elephant"            "gone"                "goodnight"           "grandma"            
[26] "horse"               "look"                "mine"                "mommy"               "my"                 
[31] "no"                  "pajamas"             "park"                "patty_cake"          "peekaboo"           
[36] "pool"                "rain"                "stroller"            "telephone/cellphone" "train"              
[41] "tree"                "tummy"               "uh_oh"               "water"               "water.1"            
[46] "where"               "woof_woof"           "yucky"               "yum_yum"            
# words_study_babies = data.frame(rownames = colnames(Objects_study_babies))
# 
# for (i in c(1:14))
#   {
#   words_study_babies = colnames(Objects_study_babies)[as.logical(Objects_study_babies[i,])]
#   }
CC = read.csv(file = 'cooccuranceCHILDES.csv')
rownames(CC) = CC$X
CC
CC = CC[,-1]
CC
babysubset = CC[rownames(CC)%in%baby1,colnames(CC)%in%baby1]
babymatrix = as.matrix(babysubset)
babymatrix
        banana book  cat daddy grandma kitty mommy bite tickle
banana     419    0    0     0       0     0     0    0      0
book        10 2861  174     0      10   189     0    0     14
cat          0    0 1491     0       0  1654     0    0      4
daddy       12  184   34  1608      23    59     0   33     31
grandma      0    0   11     0     116    17     0    0      0
kitty        0    0    0     0       0  2121     0    0      0
mommy       60  760   57   943      26   153  2882  157    130
bite        11   15   19     0       0    31     0  510     11
tickle       0    0    0     0       0     0     0    0   3261
colSums(babysubset)+rowSums(babysubset)
 banana    book     cat   daddy grandma   kitty   mommy    bite  tickle 
    931    7078    4935    4535     319    6345    8050    1297    6712 
babygraph = graph_from_adjacency_matrix(babymatrix, weighted=TRUE, mode="plus")
E(babygraph)
+ 38/38 edges from cfbf5eb (vertex names):
 [1] banana --banana  banana --book    banana --daddy   banana --mommy   banana --bite    book   --book    book   --cat     book   --daddy   book   --grandma
[10] book   --kitty   book   --mommy   book   --bite    book   --tickle  cat    --cat     cat    --daddy   cat    --grandma cat    --kitty   cat    --mommy  
[19] cat    --bite    cat    --tickle  daddy  --daddy   daddy  --grandma daddy  --kitty   daddy  --mommy   daddy  --bite    daddy  --tickle  grandma--grandma
[28] grandma--kitty   grandma--mommy   kitty  --kitty   kitty  --mommy   kitty  --bite    mommy  --mommy   mommy  --bite    mommy  --tickle  bite   --bite   
[37] bite   --tickle  tickle --tickle 
plot(babygraph, vertex.size = 20, vertex.color="SkyBlue2",vertex.frame.color=NA,vertex.label.cex = .9,vertex.label.color="black", edge.arrow.size = 0,edge.curve=TRUE,edge.label=E(babygraph)$weight,edge.label.cex = .7,edge.label.color="black")

#babygraph 
similarity(babygraph,vids=V(babygraph))
           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]      [,7]      [,8]      [,9]
 [1,] 1.0000000 0.3333333 0.5714286 0.3333333 0.5000000 0.6666667 0.3333333 0.3750000 0.8000000
 [2,] 0.3333333 1.0000000 0.6666667 0.7777778 0.4444444 0.5555556 0.7777778 0.6666667 0.4444444
 [3,] 0.5714286 0.6666667 1.0000000 0.6666667 0.5000000 0.6250000 0.6666667 0.5555556 0.5000000
 [4,] 0.3333333 0.7777778 0.6666667 1.0000000 0.4444444 0.5555556 0.7777778 0.6666667 0.4444444
 [5,] 0.5000000 0.4444444 0.5000000 0.4444444 1.0000000 0.5714286 0.4444444 0.7142857 0.6666667
 [6,] 0.6666667 0.5555556 0.6250000 0.5555556 0.5714286 1.0000000 0.5555556 0.4444444 0.8333333
 [7,] 0.3333333 0.7777778 0.6666667 0.7777778 0.4444444 0.5555556 1.0000000 0.6666667 0.4444444
 [8,] 0.3750000 0.6666667 0.5555556 0.6666667 0.7142857 0.4444444 0.6666667 1.0000000 0.5000000
 [9,] 0.8000000 0.4444444 0.5000000 0.4444444 0.6666667 0.8333333 0.4444444 0.5000000 1.0000000
V(babygraph)
+ 9/9 vertices, named, from cfbf5eb:
[1] banana  book    cat     daddy   grandma kitty   mommy   bite    tickle 
edges(babygraph)$weights
NULL
graph_parameters_babies = data.frame(edge_densities = numeric(),
                                     edge_connectivities = numeric(),
                                     eccentricities = numeric(),
                                     diversities = numeric(),
                                     mean_path_lengths = numeric(),
                                     distances = matrix(),
                                     mean_distances = numeric(),
                                     degrees = numeric(),
                                     mean_degrees = numeric(),
                                     vertex_connectivities = numeric(),
                                     cohesions = numeric(),
                                     cocitations = matrix(),
                                     component = list(),
                                     component_counts = numeric(),
                                     closenesss = numeric(),
                                     vertex_betweenness = numeric(),
                                     edge_betweennesss = numeric())
Error in data.frame(edge_densities = numeric(), edge_connectivities = numeric(),  : 
  arguments imply differing number of rows: 0, 1
create_empty_table <- function(num_rows, num_cols) {
    frame <- data.frame(matrix(NA, nrow = num_rows, ncol = num_cols))
    return(frame)
}
graph_parameters_babies = create_empty_table(14,26)
colnames(graph_parameters_babies) = c('edge_density',
                                     'edge_connectivity',
                                     #'eccentricity',
                                     'mean_eccentricity', #
                                     #'diversity',
                                     'mean_diversity', #
                                     'mean_path_length',
                                     'distance',
                                     'mean_distance',
                                     #'degree',
                                     #'normalized_degree',
                                     'normalized_mean_degree', #
                                     'mean_degree',
                                     'vertex_connectivity',
                                     'cohesion',
                                     #'cocitation',
                                     'mean_cocitation',#
                                     #'strength',#
                                     'mean_strength',#
                                     #'component',
                                     'component_count',
                                     #'closeness',
                                     #'normalized_closeness',
                                     'normalized_mean_closeness',#
                                     'mean_closeness',#
                                     #'vertex_betweenness',
                                     #'normalized_vertex_betweenness',
                                     'mean_vertex_betweenness',#                                     
                                     'normalized_mean_vertex_betweenness',#
                                     #'edge_betweenness',
                                     'mean_edge_betweenness',
                                     'global_clustering_coefficient',
                                     'avg_clustering_coefficient',
                                     'local_clustering_coefficient',
                                     'weighted_clustering_coefficient',
                                     'normalized_median_degree', #
                                     'median_degree',
                                     'number_of_words')
                                            
for (i in c(1:14)){
  name = paste("Graph for",rownames(Objects_study_babies)[i])
  filename = paste(rownames(Objects_study_babies)[i],"_graph.csv")
  baby = colnames(Objects_study_babies)[as.logical(Objects_study_babies[i,])]
  baby = sort(baby)
  babysubset = CC[rownames(CC)%in%baby,colnames(CC)%in%baby]
  babymatrix = as.matrix(babysubset)
  babygraph = graph_from_adjacency_matrix(babymatrix, weighted=TRUE, mode="plus")
  babygraph=simplify(babygraph, remove.multiple = TRUE, remove.loops = TRUE, edge.attr.comb = igraph_opt("edge.attr.comb"))
  plot(babygraph, vertex.size = 20, vertex.color="SkyBlue2",vertex.frame.color=NA,vertex.label.cex = .5,vertex.label.color="black", edge.arrow.size = 0,edge.curve=FALSE,edge.label=E(babygraph)$weight,edge.label.cex = .3,edge.label.color="black",rescale=TRUE, main = name, layout = layout.fruchterman.reingold)
  
  #write.csv(babymatrix,file=filename)
  
  #layout.graphopt
  #layout.fruchterman.reingold
  
  
  # computations
  graph_parameters_babies[i,1] = edge_density(babygraph)
  graph_parameters_babies[i,2] = edge.connectivity(babygraph)
#  graph_parameters_babies[i,3] = eccentricity(babygraph, vids = V(babygraph))
  graph_parameters_babies[i,3] = mean(eccentricity(babygraph, vids = V(babygraph)))
#  graph_parameters_babies[i,4] = diversity(babygraph, weights = E(babygraph)$weight, vids = V(babygraph))
  #graph_parameters_babies[i,4] = mean(diversity(babygraph, weights = E(babygraph)$weight, vids = V(babygraph)))
  graph_parameters_babies[i,5] = average.path.length(babygraph, unconnected = TRUE)
#  graph_parameters_babies[i,6] = distances(babygraph)
  graph_parameters_babies[i,7] = mean(distances(babygraph))
#  graph_parameters_babies[i,8] = degree(babygraph, v = V(babygraph), loops = FALSE, normalized = FALSE)
#  graph_parameters_babies[i,8] = degree(babygraph, v = V(babygraph), loops = FALSE, normalized = FALSE)
  graph_parameters_babies[i,8] = mean(degree(babygraph, v = V(babygraph), loops = FALSE, normalized = TRUE))
  graph_parameters_babies[i,9] = mean(degree(babygraph, v = V(babygraph), loops = FALSE, normalized = FALSE))
                                       #ADD MEDIAN
  graph_parameters_babies[i,10] = vertex_connectivity(babygraph, source = NULL, target = NULL, checks = TRUE)
  graph_parameters_babies[i,11] = cohesion(babygraph)
#  graph_parameters_babies[i,12] = cocitation(babygraph, v = V(babygraph))
  graph_parameters_babies[i,12] = mean(cocitation(babygraph, v = V(babygraph)))
#  graph_parameters_babies[i,13] = strength(babygraph, loops = FALSE)
  graph_parameters_babies[i,13] = mean(strength(babygraph, loops = FALSE))
#  graph_parameters_babies[i,13] = components(babygraph)
  graph_parameters_babies[i,14] = count_components(babygraph)
#  graph_parameters_babies[i,15] = closeness(babygraph, vids = V(babygraph), weights = E(babygraph)$weight, normalized = FALSE)
#  graph_parameters_babies[i,15] = closeness(babygraph, vids = V(babygraph), weights = E(babygraph)$weight, normalized = TRUE)
  graph_parameters_babies[i,15] = mean(closeness(babygraph, vids = V(babygraph), weights = E(babygraph)$weight, normalized = FALSE))
  graph_parameters_babies[i,16] = mean(closeness(babygraph, vids = V(babygraph), weights = E(babygraph)$weight, normalized = TRUE))
#  graph_parameters_babies[i,16] = betweenness(babygraph, v = V(babygraph), directed = FALSE, weights = E(babygraph)$weight, normalized = FALSE)
#  graph_parameters_babies[i,16] = betweenness(babygraph, v = V(babygraph), directed = FALSE, weights = E(babygraph)$weight, normalized = TRUE)
  graph_parameters_babies[i,17] = mean(betweenness(babygraph, v = V(babygraph), directed = FALSE, weights = E(babygraph)$weight, normalized = FALSE))
  graph_parameters_babies[i,18] = mean(betweenness(babygraph, v = V(babygraph), directed = FALSE, weights = E(babygraph)$weight, normalized = TRUE))
  #add normalized^
#  graph_parameters_babies[i,17] = edge_betweenness(babygraph, e = E(babygraph), directed = FALSE, weights = E(babygraph)$weight))
  graph_parameters_babies[i,19] = mean(edge_betweenness(babygraph, e = E(babygraph), directed = FALSE, weights = E(babygraph)$weight))
  # Global clustering coefficient
  graph_parameters_babies[i,20] = transitivity(babygraph)
  # Average clustering coefficient
  graph_parameters_babies[i,21] = transitivity(babygraph, type = "average")
  # The same as above
  graph_parameters_babies[i,22] = mean(transitivity(babygraph, type = "local"), na.rm = TRUE)
  graph_parameters_babies[i,23] = mean(transitivity(babygraph, type = "barrat"), na.rm = TRUE)
  graph_parameters_babies[i,24] = median(degree(babygraph, v = V(babygraph), loops = FALSE, normalized = TRUE))
  graph_parameters_babies[i,25] = median(degree(babygraph, v = V(babygraph), loops = FALSE, normalized = FALSE))
  graph_parameters_babies[i,26] = gorder(babygraph)
  
  rownames(graph_parameters_babies)[i]=rownames(Objects_study_babies)[i]
}

At centrality.c:2617 :closeness centrality is not well-defined for disconnected graphsAt centrality.c:2617 :closeness centrality is not well-defined for disconnected graphs

At centrality.c:2617 :closeness centrality is not well-defined for disconnected graphsAt centrality.c:2617 :closeness centrality is not well-defined for disconnected graphs

At centrality.c:2617 :closeness centrality is not well-defined for disconnected graphsAt centrality.c:2617 :closeness centrality is not well-defined for disconnected graphs

At centrality.c:2617 :closeness centrality is not well-defined for disconnected graphsAt centrality.c:2617 :closeness centrality is not well-defined for disconnected graphs

graph_parameters_babies # after simplify
graph_parameters_babies
write.csv(graph_parameters_babies,file = "IndividualGraphParameters.csv")
y=as.matrix(graph_parameters_babies)
colnames(y)=c(1:26)
rownames(y)=c(1:14)
write.csv(y,file = "IndividualGraphParameters_noLabels.csv")
baby = colnames(Objects_study_babies)[as.logical(Objects_study_babies[8,])]
  baby = sort(baby)
  babysubset = CC[rownames(CC)%in%baby,colnames(CC)%in%baby]
  babymatrix = as.matrix(babysubset)
  babygraph = graph_from_adjacency_matrix(babymatrix, weighted=TRUE, mode="plus")
  babygraph=simplify(babygraph, remove.multiple = TRUE, remove.loops = TRUE, edge.attr.comb = igraph_opt("edge.attr.comb"))
  
x=distances(babygraph)
x[is.infinite(x)]=NA
mean(x, na.rm = TRUE)
[1] 9.958621
graph_parameters_babies[8,7] = mean(x, na.rm = TRUE)
graph_parameters_babies
# dealing with Inf
A[is.infinite(A)]<-NA
Error in A[is.infinite(A)] <- NA : object 'A' not found
  baby = colnames(Objects_study_babies)[as.logical(Objects_study_babies[8,])]
  baby = sort(baby)
  babysubset = CC[rownames(CC)%in%baby,rownames(CC)%in%baby]
  babymatrix = as.matrix(babysubset)
  babygraph = graph_from_adjacency_matrix(babymatrix, weighted=TRUE, mode="plus")
  babygraph=simplify(babygraph, remove.multiple = FALSE, remove.loops = TRUE, edge.attr.comb = igraph_opt("edge.attr.comb"))
plot(vocab_studybabies, graph_parameters_babies$median_degree,type = "p")

plot(vocab_studybabies, graph_parameters_babies$mean_distance,type = "p")

plot(vocab_studybabies, graph_parameters_babies$mean_path_length,type = "p")

plot(vocab_studybabies, graph_parameters_babies$avg_clustering_coefficient,type = "p")

plot(vocab_studybabies, graph_parameters_babies$global_clustering_coefficient,type = "p")

library("ggpubr")
package ‘ggpubr’ was built under R version 3.5.2Loading required package: magrittr

Attaching package: ‘ggpubr’

The following object is masked from ‘package:cowplot’:

    get_legend
my_data = data.frame(vocab = vocab_studybabies, network_size = graph_parameters_babies$number_of_words, median_degree = graph_parameters_babies$median_degree, normalized_median_degree = graph_parameters_babies$normalized_median_degree ,mean_weighted_distance = graph_parameters_babies$mean_distance, mean_path_length = graph_parameters_babies$mean_path_length, average_clustering_coefficient = graph_parameters_babies$avg_clustering_coefficient, global_clustering_coefficient = graph_parameters_babies$global_clustering_coefficient )
my_data$vocab[13:14] = c(27,5)
rownames(my_data)[13:14] = c('SD139','SD141')
vXmd = ggscatter(my_data, x = "vocab", y = "median_degree", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "spearman",
          xlab = "Vocabulary Size (# of words)", ylab = "Median Degree")
vXnmd = ggscatter(my_data, x = "vocab", y = "normalized_median_degree", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "spearman",
          xlab = "Vocabulary Size (# of words)", ylab = "Normalized Median Degree", title = 'Correlating Median Degree with Vocabulary Size')
vXmwd = ggscatter(my_data, x = "vocab", y = "mean_weighted_distance", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "spearman",
          xlab = "Vocabulary Size (# of words)", ylab = "Mean Weighted Distance Between Words")
vXpl = ggscatter(my_data, x = "vocab", y = "mean_path_length", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "spearman",
          xlab = "Vocabulary Size (# of words)", ylab = "Mean Path Length Between Words")

ggarrange(vXmd, vXpl, vXgcc,
          labels = c("A", "B", "C"),
          ncol = 3, nrow = 1)
Removed 1 rows containing non-finite values (stat_smooth).Removed 1 rows containing non-finite values (stat_cor).Removed 1 rows containing missing values (geom_point).Removed 1 rows containing non-finite values (stat_smooth).Removed 1 rows containing non-finite values (stat_cor).Removed 1 rows containing missing values (geom_point).

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgoKYGBge3J9CiMgQWRkIHBhY2thZ2VzCmxpYnJhcnkoaWdyYXBoKQojbGlicmFyeSh0Y2x0aykKYGBgCgpgYGB7cn0KIyBSZWFkIGluIE1DREkgZGF0YQpSYXdNQ0RJID0gcmVhZC5jc3YoIk1DRElfMjAxOTA5MDZfcmVsYWJlbGVkLmNzdiIsYXMuaXMgPSBUUlVFKQpSYXdNQ0RJCmBgYAoKYGBge3J9CiMjIFByZXBhcmUgZGF0YXNldApJbmZvID0gUmF3TUNESVssYyg3LDgsMTgpXQpJbmZvCgpRdWVzdGlvbnMgPSBSYXdNQ0RJWywyNjo0MjFdClF1ZXN0aW9ucwpxdWVzdGlvbnNCb29sID0gUXVlc3Rpb25zWy1jKDEsMiksXQpxdWVzdGlvbnNCb29sID0gcXVlc3Rpb25zQm9vbCE9IiIKcXVlc3Rpb25zQm9vbApiYWJ5Q29kZXMgPSBSYXdNQ0RJJFEyWy1jKDEsMildCmJhYnlDb2RlcwoKIyBSZWFzc2VtYmxlIGRhdGFzZXQKRGF0YSA9IGNiaW5kKEluZm8sIFF1ZXN0aW9ucykKRGF0YQoKIyBEZWxldGUgcmVkdW5kYW50IHJvdyBvZiBleHRyYSBsYWJlbHMKRGF0YSA9IERhdGFbLTEsXQpEYXRhCgojIENoYW5nZSB0byBCb29sZWFuCmNvbG5hbWVzKERhdGEpID0gRGF0YVsxLF0KRGF0YSA9IERhdGFbLTEsXQpEYXRhWyw0Omxlbmd0aChEYXRhKV0gPSBEYXRhWyw0Omxlbmd0aChEYXRhKV0hPSIiCkRhdGEKT2JqZWN0cyA9IERhdGFbLC1jKDE6MyldCnJvd25hbWVzKE9iamVjdHMpPURhdGEkUGFydGljaXBhbnRfSUQKT2JqZWN0cwpPYmplY3RzID0gT2JqZWN0c1sgLCBvcmRlcihuYW1lcyhPYmplY3RzKSldCnJvd25hbWVzKE9iamVjdHMpWzFdID0gJ1NEMTA0Jwpyb3duYW1lcyhPYmplY3RzKVsxMl0gPSAnU0QxMjQnCk9iamVjdHMgPSBPYmplY3RzW29yZGVyKHJvd25hbWVzKE9iamVjdHMpKSxdCk9iamVjdHMKYGBgCgpgYGB7cn0KIyByZW1vdmUgc3ViamVjdCB3aG8gd2VyZSBub3QgaW4gdGhlIGZpbmFsIGRhdGFzZXQKc3R1ZHlfYmFiaWVzID0gYygnU0QxMDInLCAnU0QxMDcnLCAnU0QxMDgnLCAnU0QxMTQnLCAnU0QxMTgnLCAnU0QxMjAnLCAnU0QxMjQnLCAnU0QxMjYnLCAnU0QxMjcnLCAnU0QxMzAnLCAnU0QxMzMnLCAnU0QxMzgnLCAnU0QxNDEnLCAnU0QxMzknKQpnZXRCYWJpZXMgPSByb3duYW1lcyhPYmplY3RzKSVpbiVzdHVkeV9iYWJpZXMKT2JqZWN0c19zdHVkeV9iYWJpZXMgPSBPYmplY3RzW2dldEJhYmllcyxdCk9iamVjdHNfc3R1ZHlfYmFiaWVzCmBgYAoKYGBge3J9CkRhdGFfc3R1ZHliYWJpZXMgPSBEYXRhCm9sZF9jb2xuYW1lcyA9IGNvbG5hbWVzKERhdGFfc3R1ZHliYWJpZXMpCmNvbG5hbWVzKERhdGFfc3R1ZHliYWJpZXMpID0gRGF0YV9zdHVkeWJhYmllc1sxLF0KY29sbmFtZXMoRGF0YV9zdHVkeWJhYmllcylbM10gPSAnSUQnCkRhdGFfc3R1ZHliYWJpZXNbMiwzXSA9ICdTRDEwNCcKRGF0YV9zdHVkeWJhYmllcz1EYXRhX3N0dWR5YmFiaWVzWy0xLF0KRGF0YV9zdHVkeWJhYmllcz0gRGF0YV9zdHVkeWJhYmllc1tvcmRlcihEYXRhX3N0dWR5YmFiaWVzJElEKSxdCkRhdGFfc3R1ZHliYWJpZXMKRGF0YV9zdHVkeWJhYmllc1sxMCwzXSA9ICdTRDEyNCcKCkRhdGFfc3R1ZHliYWJpZXMKCiMgR2V0IHJlbGV2YW50IGJhYmllcyAtIHJlbW92ZSB0aG9zZSB3aG8gZGlkIG5vdCBjb21wbGV0ZSB0aGUgTUNESQpiYWJpZXMgPSBjKCdTRDEwMicsICdTRDEwNycsICdTRDEwOCcsICdTRDExNCcsICdTRDExOCcsICdTRDEyMCcsICdTRDEyNCcsICdTRDEyNicsICdTRDEyNycsICdTRDEzMCcsICdTRDEzMycsICdTRDEzOCcsICdTRDE0MScsICdTRDEzOScpCmdldF9iYWJpZXMgPSBEYXRhX3N0dWR5YmFiaWVzJElEJWluJWJhYmllcwpEYXRhX3N0dWR5YmFiaWVzPSBEYXRhX3N0dWR5YmFiaWVzWyFnZXRfYmFiaWVzLF0Kcm93bmFtZXMoRGF0YV9zdHVkeWJhYmllcyk9YygxOjE0KQpEYXRhX3N0dWR5YmFiaWVzCgphbGxNQ0RJX3N0dWR5YmFiaWVzID0gRGF0YV9zdHVkeWJhYmllcwpyb3duYW1lcyhhbGxNQ0RJX3N0dWR5YmFiaWVzKSA9IGFsbE1DRElfc3R1ZHliYWJpZXNbLDNdCmFsbE1DRElfc3R1ZHliYWJpZXMgPSBhbGxNQ0RJX3N0dWR5YmFiaWVzWywtYygxLDIsMyldCmFsbE1DRElfc3R1ZHliYWJpZXMgPSAoYWxsTUNESV9zdHVkeWJhYmllcz09J1RSVUUnKQp2b2NhYl9zdHVkeWJhYmllcyA9IHJvd1N1bXMoYWxsTUNESV9zdHVkeWJhYmllcykKdm9jYWJfc3R1ZHliYWJpZXMKYGBgCgoKYGBge3J9CmJhYnkxID0gY29sbmFtZXMoT2JqZWN0c19zdHVkeV9iYWJpZXMpW2FzLmxvZ2ljYWwoT2JqZWN0c19zdHVkeV9iYWJpZXNbMTIsXSldCmJhYnkxPXNvcnQoYmFieTEpCmJhYnkxCmBgYAoKCmBgYHtyfQpDQyA9IHJlYWQuY3N2KGZpbGUgPSAnY29vY2N1cmFuY2VDSElMREVTLmNzdicpCnJvd25hbWVzKENDKSA9IENDJFgKQ0MKQ0MgPSBDQ1ssLTFdCkNDCmBgYAoKYGBge3J9CiMgU2FtcGxlOiBHZXQga25vd24gd29yZHMgZm9yIGJhYnkgMQpiYWJ5MQpiYWJ5MSVpbiVjb2xuYW1lcyhDQykKYmFieTFbYmFieTElaW4lY29sbmFtZXMoQ0MpXQpjb2xuYW1lcyhDQylbY29sbmFtZXMoQ0MpJWluJWJhYnkxXQpiYWJ5MV9tYXRyaXg9Q0Nbcm93bmFtZXMoQ0MpJWluJWJhYnkxLGNvbG5hbWVzKENDKSVpbiViYWJ5MV0KCmBgYAoKCmBgYHtyfQphID0gQ0NbLGNvbG5hbWVzKENDKSVpbiVjb2xuYW1lcyhPYmplY3RzX3N0dWR5X2JhYmllcyldCmIgPSBPYmplY3RzX3N0dWR5X2JhYmllc1ssY29sbmFtZXMoT2JqZWN0c19zdHVkeV9iYWJpZXMpJWluJWNvbG5hbWVzKENDKV0KCmJhYnkxID0gYVssYXMubG9naWNhbChiWzEsXSldCmJhYnkxW3Jvd25hbWVzKGJhYnkxKSVpbiVjb2xuYW1lcyhiYWJ5MSksXQpgYGAKCmBgYHtyfQpiYWJ5c3Vic2V0ID0gQ0Nbcm93bmFtZXMoQ0MpJWluJWJhYnkxLGNvbG5hbWVzKENDKSVpbiViYWJ5MV0KYmFieW1hdHJpeCA9IGFzLm1hdHJpeChiYWJ5c3Vic2V0KQpiYWJ5bWF0cml4CmBgYAoKYGBge3J9CmNvbnRleHR1YWxfZGl2ZXJzaXR5ID0gY29sU3VtcyhiYWJ5c3Vic2V0KStyb3dTdW1zKGJhYnlzdWJzZXQpCmBgYAoKYGBge3J9CmJhYnlncmFwaCA9IGdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeChiYWJ5bWF0cml4LCB3ZWlnaHRlZD1UUlVFLCBtb2RlPSJwbHVzIikKRShiYWJ5Z3JhcGgpCmBgYAoKYGBge3J9CnBsb3QoYmFieWdyYXBoLCB2ZXJ0ZXguc2l6ZSA9IDIwLCB2ZXJ0ZXguY29sb3I9IlNreUJsdWUyIix2ZXJ0ZXguZnJhbWUuY29sb3I9TkEsdmVydGV4LmxhYmVsLmNleCA9IC45LHZlcnRleC5sYWJlbC5jb2xvcj0iYmxhY2siLCBlZGdlLmFycm93LnNpemUgPSAwLGVkZ2UuY3VydmU9VFJVRSxlZGdlLmxhYmVsPUUoYmFieWdyYXBoKSR3ZWlnaHQsZWRnZS5sYWJlbC5jZXggPSAuNyxlZGdlLmxhYmVsLmNvbG9yPSJibGFjayIpCiNiYWJ5Z3JhcGggCmBgYAoKYGBge3J9CnNpbWlsYXJpdHkoYmFieWdyYXBoLHZpZHM9VihiYWJ5Z3JhcGgpKQpgYGAKCmBgYHtyfQojIFRoZSBkZW5zaXR5IG9mIGEgZ3JhcGggaXMgdGhlIHJhdGlvIG9mIHRoZSBudW1iZXIgb2YgZWRnZXMgYW5kIHRoZSBudW1iZXIgb2YgcG9zc2libGUgZWRnZXMuCmVkZ2VfZGVuc2l0eShiYWJ5Z3JhcGgpCgojIFRoZSBlZGdlIGNvbm5lY3Rpdml0eSBvZiBhIGdyYXBoIG9yIHR3byB2ZXJ0aWNlcywgdGhpcyBpcyByZWNlbnRseSBhbHNvIGNhbGxlZCBncm91cCBhZGhlc2lvbi4KIyBUaGUgZWRnZSBjb25uZWN0aXZpdHkgb2YgYSBncmFwaCBpcyB0aGUgbWluaW11bSBvZiB0aGUgZWRnZSBjb25uZWN0aXZpdHkgb2YgZXZlcnkgKG9yZGVyZWQpIHBhaXIgb2YgdmVydGljZXMgaW4gdGhlIGdyYXBoLiBlZGdlX2Nvbm5lY3Rpdml0eSBjYWxjdWxhdGVzIHRoaXMgcXVhbnRpdHkgaWYgbmVpdGhlciB0aGUgc291cmNlIG5vciB0aGUgdGFyZ2V0IGFyZ3VtZW50cyBhcmUgZ2l2ZW4gKGllLiB0aGV5IGFyZSBib3RoIE5VTEwpLgojIFRoZSBhZGhlc2lvbiBvZiBhIGdyYXBoIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBlZGdlcyBuZWVkZWQgdG8gcmVtb3ZlIHRvIG9idGFpbiBhIGdyYXBoIHdoaWNoIGlzIG5vdCBzdHJvbmdseSBjb25uZWN0ZWQuIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGVkZ2UgY29ubmVjdGl2aXR5IG9mIHRoZSBncmFwaC4KZWRnZS5jb25uZWN0aXZpdHkoYmFieWdyYXBoKQoKCiMgVGhlIGVjY2VudHJpY2l0eSBvZiBhIHZlcnRleCBpcyBpdHMgc2hvcnRlc3QgcGF0aCBkaXN0YW5jZSBmcm9tIHRoZSBmYXJ0aGVzdCBvdGhlciBub2RlIGluIHRoZSBncmFwaC4KIyBUaGUgZWNjZW50cmljaXR5IG9mIGEgdmVydGV4IGlzIGNhbGN1bGF0ZWQgYnkgbWVhc3VyaW5nIHRoZSBzaG9ydGVzdCBkaXN0YW5jZSBmcm9tIChvciB0bykgdGhlIHZlcnRleCwgdG8gKG9yIGZyb20pIGFsbCB2ZXJ0aWNlcyBpbiB0aGUgZ3JhcGgsIGFuZCB0YWtpbmcgdGhlIG1heGltdW0uCiMgVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHZlcnRleCBwYWlycyB0aGF0IGFyZSBpbiBkaWZmZXJlbnQgY29tcG9uZW50cy4gSXNvbGF0ZSB2ZXJ0aWNlcyBoYXZlIGVjY2VudHJpY2l0eSB6ZXJvLgplY2NlbnRyaWNpdHkoYmFieWdyYXBoLCB2aWRzID0gVihiYWJ5Z3JhcGgpKQoKIyBDYWxjdWxhdGVzIGEgbWVhc3VyZSBvZiBkaXZlcnNpdHkgZm9yIGFsbCB2ZXJ0aWNlcy4KIyBUaGUgZGl2ZXJzaXR5IG9mIGEgdmVydGV4IGlzIGRlZmluZWQgYXMgdGhlIChzY2FsZWQpIFNoYW5ub24gZW50cm9weSBvZiB0aGUgd2VpZ2h0cyBvZiBpdHMgaW5jaWRlbnQgZWRnZXM6CiMgICAgIEQoaSk9SChpKS9sb2coa1tpXSkKIwojICAgICBhbmQKIwojICAgIEgoaSkgPSAtc3VtKHBbaSxqXSBsb2cocFtpLGpdKSwgaj0xLi5rW2ldKSwKIwojICAgIHdoZXJlCiMKIyAgICBwW2ksal0gPSB3W2ksal0gLyBzdW0od1tpLGxdLCBsPTEuLmtbaV0pLAojCiMgICAgYW5kIGtbaV0gaXMgdGhlICh0b3RhbCkgZGVncmVlIG9mIHZlcnRleCBpLCB3W2ksal0gaXMgdGhlIHdlaWdodCBvZiB0aGUgZWRnZShzKSBiZXR3ZWVuIHZlcnRpY2VzIGkgYW5kIGouCiMKIyBGb3IgdmVydGljZXMgd2l0aCBkZWdyZWUgbGVzcyB0aGFuIHR3byB0aGUgZnVuY3Rpb24gcmV0dXJucyBOYU4uCgpkaXZlcnNpdHkoYmFieWdyYXBoLCB3ZWlnaHRzID0gTlVMTCwgdmlkcyA9IFYoYmFieWdyYXBoKSkKCgojIGRpc3RhbmNlcyBjYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYWxsIHRoZSBzaG9ydGVzdCBwYXRocyBmcm9tIG9yIHRvIHRoZSB2ZXJ0aWNlcyBpbiB0aGUgbmV0d29yay4gc2hvcnRlc3RfcGF0aHMgY2FsY3VsYXRlcyBvbmUgc2hvcnRlc3QgcGF0aCAodGhlIHBhdGggaXRzZWxmLCBhbmQgbm90IGp1c3QgaXRzIGxlbmd0aCkgZnJvbSBvciB0byB0aGUgZ2l2ZW4gdmVydGV4LgojIFRoZSBzaG9ydGVzdCBwYXRoLCBvciBnZW9kZXNpYyBiZXR3ZWVuIHR3byBwYWlyIG9mIHZlcnRpY2VzIGlzIGEgcGF0aCB3aXRoIHRoZSBtaW5pbWFsIG51bWJlciBvZiB2ZXJ0aWNlcy4gVGhlIGZ1bmN0aW9ucyBkb2N1bWVudGVkIGluIHRoaXMgbWFudWFsIHBhZ2UgYWxsIGNhbGN1bGF0ZSBzaG9ydGVzdCBwYXRocyBiZXR3ZWVuIHZlcnRleCBwYWlycy4KCiNtZWFuX2Rpc3RhbmNlIGNhbGN1bGF0ZXMgdGhlIGF2ZXJhZ2UgcGF0aCBsZW5ndGggaW4gYSBncmFwaCwgYnkgY2FsY3VsYXRpbmcgdGhlIHNob3J0ZXN0IHBhdGhzIGJldHdlZW4gYWxsIHBhaXJzIG9mIHZlcnRpY2VzIChib3RoIHdheXMgZm9yIGRpcmVjdGVkIGdyYXBocykuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY29uc2lkZXIgZWRnZSB3ZWlnaHRzIGN1cnJlbnRseSBhbmQgdXNlcyBhIGJyZWFkdGgtZmlyc3Qgc2VhcmNoLgptZWFuX2Rpc3RhbmNlKGJhYnlncmFwaCwgZGlyZWN0ZWQgPSBGQUxTRSwgdW5jb25uZWN0ZWQgPSBGQUxTRSkKYXZlcmFnZS5wYXRoLmxlbmd0aChiYWJ5Z3JhcGgpCgojIGRpc3RhbmNlcyBjYWxjdWxhdGVzIHRoZSBsZW5ndGhzIG9mIHBhaXJ3aXNlIHNob3J0ZXN0IHBhdGhzIGZyb20gYSBzZXQgb2YgdmVydGljZXMgKGZyb20pIHRvIGFub3RoZXIgc2V0IG9mIHZlcnRpY2VzICh0bykuIEl0IHVzZXMgZGlmZmVyZW50IGFsZ29yaXRobXMsIGRlcGVuZGluZyBvbiB0aGUgYWxnb3JpdGhtIGFyZ3VtZW50IGFuZCB0aGUgd2VpZ2h0IGVkZ2UgYXR0cmlidXRlIG9mIHRoZSBncmFwaC4gVGhlIGltcGxlbWVudGVkIGFsZ29yaXRobXMgYXJlIGJyZWFkdGgtZmlyc3Qgc2VhcmNoICjigJh1bndlaWdodGVk4oCZKSwgdGhpcyBvbmx5IHdvcmtzIGZvciB1bndlaWdodGVkIGdyYXBoczsgdGhlIERpamtzdHJhIGFsZ29yaXRobSAo4oCYZGlqa3N0cmHigJkpLCB0aGlzIHdvcmtzIGZvciBncmFwaHMgd2l0aCBub24tbmVnYXRpdmUgZWRnZSB3ZWlnaHRzOyB0aGUgQmVsbG1hbi1Gb3JkIGFsZ29yaXRobSAo4oCYYmVsbG1hbi1mb3Jk4oCZKSwgYW5kIEpvaG5zb24ncyBhbGdvcml0aG0gKOKAmCJqb2huc29uIuKAmSkuIFRoZSBsYXR0ZXIgdHdvIGFsZ29yaXRobXMgd29yayB3aXRoIGFyYml0cmFyeSBlZGdlIHdlaWdodHMsIGJ1dCAobmF0dXJhbGx5KSBvbmx5IGZvciBncmFwaHMgdGhhdCBkb24ndCBoYXZlIGEgbmVnYXRpdmUgY3ljbGUuCmRpc3RhbmNlcyhiYWJ5Z3JhcGgpCm1lYW4oZGlzdGFuY2VzKGJhYnlncmFwaCkpCgojVGhlIGRlZ3JlZSBvZiBhIHZlcnRleCBpcyBpdHMgbW9zdCBiYXNpYyBzdHJ1Y3R1cmFsIHByb3BlcnR5LCB0aGUgbnVtYmVyIG9mIGl0cyBhZGphY2VudCBlZGdlcy4KZGVncmVlKGJhYnlncmFwaCwgdiA9IFYoYmFieWdyYXBoKSwgbG9vcHMgPSBGQUxTRSwgbm9ybWFsaXplZCA9IEZBTFNFKQptZWFuKGRlZ3JlZShiYWJ5Z3JhcGgsIHYgPSBWKGJhYnlncmFwaCksIGxvb3BzID0gRkFMU0UsIG5vcm1hbGl6ZWQgPSBGQUxTRSkpCgojIFRoZSB2ZXJ0ZXggY29ubmVjdGl2aXR5IG9mIGEgZ3JhcGggb3IgdHdvIHZlcnRpY2VzLCB0aGlzIGlzIHJlY2VudGx5IGFsc28gY2FsbGVkIGdyb3VwIGNvaGVzaW9uLgojIFRoZSB2ZXJ0ZXggY29ubmVjdGl2aXR5IG9mIGEgZ3JhcGggaXMgdGhlIG1pbmltdW0gdmVydGV4IGNvbm5lY3Rpdml0eSBvZiBhbGwgKG9yZGVyZWQpIHBhaXJzIG9mIHZlcnRpY2VzIGluIHRoZSBncmFwaC4gSW4gb3RoZXIgd29yZHMgdGhpcyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgdmVydGljZXMgbmVlZGVkIHRvIHJlbW92ZSB0byBtYWtlIHRoZSBncmFwaCBub3Qgc3Ryb25nbHkgY29ubmVjdGVkLiAoSWYgdGhlIGdyYXBoIGlzIG5vdCBzdHJvbmdseSBjb25uZWN0ZWQgdGhlbiB0aGlzIGlzIHplcm8uKSB2ZXJ0ZXhfY29ubmVjdGl2aXR5IGNhbGN1bGF0ZXMgdGhpcyBxdWFudGl0dHkgaWYgbmVpdGhlciB0aGUgc291cmNlIG5vciB0YXJnZXQgYXJndW1lbnRzIGFyZSBnaXZlbi4gKEllLiB0aGV5IGFyZSBib3RoIE5VTEwuKQp2ZXJ0ZXhfY29ubmVjdGl2aXR5KGJhYnlncmFwaCwgc291cmNlID0gTlVMTCwgdGFyZ2V0ID0gTlVMTCwgY2hlY2tzID0gVFJVRSkKIyBUaGUgY29oZXNpb24gb2YgYSBncmFwaCAoYXMgZGVmaW5lZCBieSBXaGl0ZSBhbmQgSGFyYXJ5LCBzZWUgcmVmZXJlbmNlcyksIGlzIHRoZSB2ZXJ0ZXggY29ubmVjdGl2aXR5IG9mIHRoZSBncmFwaC4gVGhpcyBpcyBjYWxjdWxhdGVkIGJ5IGNvaGVzaW9uLgpjb2hlc2lvbihiYWJ5Z3JhcGgpCgoKIyBUd28gdmVydGljZXMgYXJlIGNvY2l0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciB2ZXJ0ZXggY2l0aW5nIGJvdGggb2YgdGhlbS4gY29jaXRhdGlvbiBzaXBseSBjb3VudHMgaG93IG1hbnkgdHlwZXMgdHdvIHZlcnRpY2VzIGFyZSBjb2NpdGVkLiBUaGUgYmlibGlvZ3JhcGhpYyBjb3VwbGluZyBvZiB0d28gdmVydGljZXMgaXMgdGhlIG51bWJlciBvZiBvdGhlciB2ZXJ0aWNlcyB0aGV5IGJvdGggY2l0ZSwgYmliY291cGxpbmcgY2FsY3VsYXRlcyB0aGlzLgpjb2NpdGF0aW9uKGJhYnlncmFwaCwgdiA9IFYoYmFieWdyYXBoKSkKCgojIGNsdXN0ZXJzCiMgQ2FsY3VsYXRlIHRoZSBtYXhpbWFsICh3ZWFrbHkgb3Igc3Ryb25nbHkpIGNvbm5lY3RlZCBjb21wb25lbnRzIG9mIGEgZ3JhcGgKIyBGb3IgY29tcG9uZW50cyBhIG5hbWVkIGxpc3Qgd2l0aCB0aHJlZSBjb21wb25lbnRzOgojICAgICBtZW1iZXJzaGlwCQojICAgICAgIG51bWVyaWMgdmVjdG9yIGdpdmluZyB0aGUgY2x1c3RlciBpZCB0byB3aGljaCBlYWNoIHZlcnRleCBiZWxvbmdzLgojICAgICBjc2l6ZQkKIyAgICAgICBudW1lcmljIHZlY3RvciBnaXZpbmcgdGhlIHNpemVzIG9mIHRoZSBjbHVzdGVycy4KIyAgICAgbm8JCiMgICAgICAgbnVtZXJpYyBjb25zdGFudCwgdGhlIG51bWJlciBvZiBjbHVzdGVycy4KY29tcG9uZW50cyhiYWJ5Z3JhcGgpCiMgRm9yIGNvdW50X2NvbXBvbmVudHMgYW4gaW50ZWdlciBjb25zdGFudCBpcyByZXR1cm5lZC4KY291bnRfY29tcG9uZW50cyhiYWJ5Z3JhcGgpCgoKIyBjbG9zZW5lc3MKIyBDbG9uZXNzIGNlbnRyYWxpdHkgbWVhc3VyZXMgaG93IG1hbnkgc3RlcHMgaXMgcmVxdWlyZWQgdG8gYWNjZXNzIGV2ZXJ5IG90aGVyIHZlcnRleCBmcm9tIGEgZ2l2ZW4gdmVydGV4LgojVGhlIGNsb3NlbmVzcyBjZW50cmFsaXR5IG9mIGEgdmVydGV4IGlzIGRlZmluZWQgYnkgdGhlIGludmVyc2Ugb2YgdGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBwYXRocyB0by9mcm9tIGFsbCB0aGUgb3RoZXIgdmVydGljZXMgaW4gdGhlIGdyYXBoOgpjbG9zZW5lc3MoYmFieWdyYXBoLCB2aWRzID0gVihiYWJ5Z3JhcGgpLCB3ZWlnaHRzID0gTlVMTCwgbm9ybWFsaXplZCA9IEZBTFNFKQoKCiMgVGhlIHZlcnRleCBhbmQgZWRnZSBiZXR3ZWVubmVzcyBhcmUgKHJvdWdobHkpIGRlZmluZWQgYnkgdGhlIG51bWJlciBvZiBnZW9kZXNpY3MgKHNob3J0ZXN0IHBhdGhzKSBnb2luZyB0aHJvdWdoIGEgdmVydGV4IG9yIGFuIGVkZ2UuCmJldHdlZW5uZXNzKGJhYnlncmFwaCwgdiA9IFYoYmFieWdyYXBoKSwgZGlyZWN0ZWQgPSBGQUxTRSwgd2VpZ2h0cyA9IE5VTEwsIG5vcm1hbGl6ZWQgPSBGQUxTRSkKZWRnZV9iZXR3ZWVubmVzcyhiYWJ5Z3JhcGgsIGUgPSBFKGJhYnlncmFwaCksIGRpcmVjdGVkID0gRkFMU0UsIHdlaWdodHMgPSBOVUxMKQpgYGAKCgpgYGB7cn0KRShiYWJ5Z3JhcGgpCmBgYAoKYGBge3J9CmdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzID0gZGF0YS5mcmFtZShlZGdlX2RlbnNpdGllcyA9IG51bWVyaWMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfY29ubmVjdGl2aXRpZXMgPSBudW1lcmljKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2NlbnRyaWNpdGllcyA9IG51bWVyaWMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmVyc2l0aWVzID0gbnVtZXJpYygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbl9wYXRoX2xlbmd0aHMgPSBudW1lcmljKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZXMgPSBtYXRyaXgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5fZGlzdGFuY2VzID0gbnVtZXJpYygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlcyA9IG51bWVyaWMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5fZGVncmVlcyA9IG51bWVyaWMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF9jb25uZWN0aXZpdGllcyA9IG51bWVyaWMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvaGVzaW9ucyA9IG51bWVyaWMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvY2l0YXRpb25zID0gbWF0cml4KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBsaXN0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfY291bnRzID0gbnVtZXJpYygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VuZXNzcyA9IG51bWVyaWMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF9iZXR3ZWVubmVzcyA9IG51bWVyaWMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfYmV0d2Vlbm5lc3NzID0gbnVtZXJpYygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgpgYGAKCmBgYHtyfQpjcmVhdGVfZW1wdHlfdGFibGUgPC0gZnVuY3Rpb24obnVtX3Jvd3MsIG51bV9jb2xzKSB7CiAgICBmcmFtZSA8LSBkYXRhLmZyYW1lKG1hdHJpeChOQSwgbnJvdyA9IG51bV9yb3dzLCBuY29sID0gbnVtX2NvbHMpKQogICAgcmV0dXJuKGZyYW1lKQp9CmBgYAoKYGBge3J9CmdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzID0gY3JlYXRlX2VtcHR5X3RhYmxlKDE0LDI2KQpjb2xuYW1lcyhncmFwaF9wYXJhbWV0ZXJzX2JhYmllcykgPSBjKCdlZGdlX2RlbnNpdHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VkZ2VfY29ubmVjdGl2aXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnZWNjZW50cmljaXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZWFuX2VjY2VudHJpY2l0eScsICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnZGl2ZXJzaXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZWFuX2RpdmVyc2l0eScsICMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZWFuX3BhdGhfbGVuZ3RoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXN0YW5jZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVhbl9kaXN0YW5jZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2RlZ3JlZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ25vcm1hbGl6ZWRfZGVncmVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3JtYWxpemVkX21lYW5fZGVncmVlJywgIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lYW5fZGVncmVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ0ZXhfY29ubmVjdGl2aXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2hlc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2NvY2l0YXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lYW5fY29jaXRhdGlvbicsIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydzdHJlbmd0aCcsIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lYW5fc3RyZW5ndGgnLCMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wb25lbnRfY291bnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydjbG9zZW5lc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydub3JtYWxpemVkX2Nsb3NlbmVzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9ybWFsaXplZF9tZWFuX2Nsb3NlbmVzcycsIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lYW5fY2xvc2VuZXNzJywjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ3ZlcnRleF9iZXR3ZWVubmVzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ25vcm1hbGl6ZWRfdmVydGV4X2JldHdlZW5uZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZWFuX3ZlcnRleF9iZXR3ZWVubmVzcycsIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3JtYWxpemVkX21lYW5fdmVydGV4X2JldHdlZW5uZXNzJywjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ2VkZ2VfYmV0d2Vlbm5lc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lYW5fZWRnZV9iZXR3ZWVubmVzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsX2NsdXN0ZXJpbmdfY29lZmZpY2llbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F2Z19jbHVzdGVyaW5nX2NvZWZmaWNpZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2NhbF9jbHVzdGVyaW5nX2NvZWZmaWNpZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWlnaHRlZF9jbHVzdGVyaW5nX2NvZWZmaWNpZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3JtYWxpemVkX21lZGlhbl9kZWdyZWUnLCAjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVkaWFuX2RlZ3JlZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtYmVyX29mX3dvcmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCmBgYAoKYGBge3J9CmZvciAoaSBpbiBjKDE6MTQpKXsKICBuYW1lID0gcGFzdGUoIkdyYXBoIGZvciIscm93bmFtZXMoT2JqZWN0c19zdHVkeV9iYWJpZXMpW2ldKQogIGZpbGVuYW1lID0gcGFzdGUocm93bmFtZXMoT2JqZWN0c19zdHVkeV9iYWJpZXMpW2ldLCJfZ3JhcGguY3N2IikKICBiYWJ5ID0gY29sbmFtZXMoT2JqZWN0c19zdHVkeV9iYWJpZXMpW2FzLmxvZ2ljYWwoT2JqZWN0c19zdHVkeV9iYWJpZXNbaSxdKV0KICBiYWJ5ID0gc29ydChiYWJ5KQogIGJhYnlzdWJzZXQgPSBDQ1tyb3duYW1lcyhDQyklaW4lYmFieSxjb2xuYW1lcyhDQyklaW4lYmFieV0KICBiYWJ5bWF0cml4ID0gYXMubWF0cml4KGJhYnlzdWJzZXQpCiAgYmFieWdyYXBoID0gZ3JhcGhfZnJvbV9hZGphY2VuY3lfbWF0cml4KGJhYnltYXRyaXgsIHdlaWdodGVkPVRSVUUsIG1vZGU9InBsdXMiKQogIGJhYnlncmFwaD1zaW1wbGlmeShiYWJ5Z3JhcGgsIHJlbW92ZS5tdWx0aXBsZSA9IFRSVUUsIHJlbW92ZS5sb29wcyA9IFRSVUUsIGVkZ2UuYXR0ci5jb21iID0gaWdyYXBoX29wdCgiZWRnZS5hdHRyLmNvbWIiKSkKICBwbG90KGJhYnlncmFwaCwgdmVydGV4LnNpemUgPSAyMCwgdmVydGV4LmNvbG9yPSJTa3lCbHVlMiIsdmVydGV4LmZyYW1lLmNvbG9yPU5BLHZlcnRleC5sYWJlbC5jZXggPSAuNSx2ZXJ0ZXgubGFiZWwuY29sb3I9ImJsYWNrIiwgZWRnZS5hcnJvdy5zaXplID0gMCxlZGdlLmN1cnZlPUZBTFNFLGVkZ2UubGFiZWw9RShiYWJ5Z3JhcGgpJHdlaWdodCxlZGdlLmxhYmVsLmNleCA9IC4zLGVkZ2UubGFiZWwuY29sb3I9ImJsYWNrIixyZXNjYWxlPVRSVUUsIG1haW4gPSBuYW1lLCBsYXlvdXQgPSBsYXlvdXQuZnJ1Y2h0ZXJtYW4ucmVpbmdvbGQpCiAgCiAgI3dyaXRlLmNzdihiYWJ5bWF0cml4LGZpbGU9ZmlsZW5hbWUpCiAgCiAgI2xheW91dC5ncmFwaG9wdAogICNsYXlvdXQuZnJ1Y2h0ZXJtYW4ucmVpbmdvbGQKICAKICAKICAjIGNvbXB1dGF0aW9ucwogIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksMV0gPSBlZGdlX2RlbnNpdHkoYmFieWdyYXBoKQogIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksMl0gPSBlZGdlLmNvbm5lY3Rpdml0eShiYWJ5Z3JhcGgpCiMgIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksM10gPSBlY2NlbnRyaWNpdHkoYmFieWdyYXBoLCB2aWRzID0gVihiYWJ5Z3JhcGgpKQogIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksM10gPSBtZWFuKGVjY2VudHJpY2l0eShiYWJ5Z3JhcGgsIHZpZHMgPSBWKGJhYnlncmFwaCkpKQojICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDRdID0gZGl2ZXJzaXR5KGJhYnlncmFwaCwgd2VpZ2h0cyA9IEUoYmFieWdyYXBoKSR3ZWlnaHQsIHZpZHMgPSBWKGJhYnlncmFwaCkpCiAgI2dyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksNF0gPSBtZWFuKGRpdmVyc2l0eShiYWJ5Z3JhcGgsIHdlaWdodHMgPSBFKGJhYnlncmFwaCkkd2VpZ2h0LCB2aWRzID0gVihiYWJ5Z3JhcGgpKSkKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDVdID0gYXZlcmFnZS5wYXRoLmxlbmd0aChiYWJ5Z3JhcGgsIHVuY29ubmVjdGVkID0gVFJVRSkKIyAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSw2XSA9IGRpc3RhbmNlcyhiYWJ5Z3JhcGgpCiAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSw3XSA9IG1lYW4oZGlzdGFuY2VzKGJhYnlncmFwaCkpCiMgIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksOF0gPSBkZWdyZWUoYmFieWdyYXBoLCB2ID0gVihiYWJ5Z3JhcGgpLCBsb29wcyA9IEZBTFNFLCBub3JtYWxpemVkID0gRkFMU0UpCiMgIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksOF0gPSBkZWdyZWUoYmFieWdyYXBoLCB2ID0gVihiYWJ5Z3JhcGgpLCBsb29wcyA9IEZBTFNFLCBub3JtYWxpemVkID0gRkFMU0UpCiAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSw4XSA9IG1lYW4oZGVncmVlKGJhYnlncmFwaCwgdiA9IFYoYmFieWdyYXBoKSwgbG9vcHMgPSBGQUxTRSwgbm9ybWFsaXplZCA9IFRSVUUpKQogIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksOV0gPSBtZWFuKGRlZ3JlZShiYWJ5Z3JhcGgsIHYgPSBWKGJhYnlncmFwaCksIGxvb3BzID0gRkFMU0UsIG5vcm1hbGl6ZWQgPSBGQUxTRSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNBREQgTUVESUFOCiAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwxMF0gPSB2ZXJ0ZXhfY29ubmVjdGl2aXR5KGJhYnlncmFwaCwgc291cmNlID0gTlVMTCwgdGFyZ2V0ID0gTlVMTCwgY2hlY2tzID0gVFJVRSkKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDExXSA9IGNvaGVzaW9uKGJhYnlncmFwaCkKIyAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwxMl0gPSBjb2NpdGF0aW9uKGJhYnlncmFwaCwgdiA9IFYoYmFieWdyYXBoKSkKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDEyXSA9IG1lYW4oY29jaXRhdGlvbihiYWJ5Z3JhcGgsIHYgPSBWKGJhYnlncmFwaCkpKQojICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDEzXSA9IHN0cmVuZ3RoKGJhYnlncmFwaCwgbG9vcHMgPSBGQUxTRSkKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDEzXSA9IG1lYW4oc3RyZW5ndGgoYmFieWdyYXBoLCBsb29wcyA9IEZBTFNFKSkKIyAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwxM10gPSBjb21wb25lbnRzKGJhYnlncmFwaCkKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDE0XSA9IGNvdW50X2NvbXBvbmVudHMoYmFieWdyYXBoKQojICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDE1XSA9IGNsb3NlbmVzcyhiYWJ5Z3JhcGgsIHZpZHMgPSBWKGJhYnlncmFwaCksIHdlaWdodHMgPSBFKGJhYnlncmFwaCkkd2VpZ2h0LCBub3JtYWxpemVkID0gRkFMU0UpCiMgIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksMTVdID0gY2xvc2VuZXNzKGJhYnlncmFwaCwgdmlkcyA9IFYoYmFieWdyYXBoKSwgd2VpZ2h0cyA9IEUoYmFieWdyYXBoKSR3ZWlnaHQsIG5vcm1hbGl6ZWQgPSBUUlVFKQogIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksMTVdID0gbWVhbihjbG9zZW5lc3MoYmFieWdyYXBoLCB2aWRzID0gVihiYWJ5Z3JhcGgpLCB3ZWlnaHRzID0gRShiYWJ5Z3JhcGgpJHdlaWdodCwgbm9ybWFsaXplZCA9IEZBTFNFKSkKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDE2XSA9IG1lYW4oY2xvc2VuZXNzKGJhYnlncmFwaCwgdmlkcyA9IFYoYmFieWdyYXBoKSwgd2VpZ2h0cyA9IEUoYmFieWdyYXBoKSR3ZWlnaHQsIG5vcm1hbGl6ZWQgPSBUUlVFKSkKIyAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwxNl0gPSBiZXR3ZWVubmVzcyhiYWJ5Z3JhcGgsIHYgPSBWKGJhYnlncmFwaCksIGRpcmVjdGVkID0gRkFMU0UsIHdlaWdodHMgPSBFKGJhYnlncmFwaCkkd2VpZ2h0LCBub3JtYWxpemVkID0gRkFMU0UpCiMgIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksMTZdID0gYmV0d2Vlbm5lc3MoYmFieWdyYXBoLCB2ID0gVihiYWJ5Z3JhcGgpLCBkaXJlY3RlZCA9IEZBTFNFLCB3ZWlnaHRzID0gRShiYWJ5Z3JhcGgpJHdlaWdodCwgbm9ybWFsaXplZCA9IFRSVUUpCiAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwxN10gPSBtZWFuKGJldHdlZW5uZXNzKGJhYnlncmFwaCwgdiA9IFYoYmFieWdyYXBoKSwgZGlyZWN0ZWQgPSBGQUxTRSwgd2VpZ2h0cyA9IEUoYmFieWdyYXBoKSR3ZWlnaHQsIG5vcm1hbGl6ZWQgPSBGQUxTRSkpCiAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwxOF0gPSBtZWFuKGJldHdlZW5uZXNzKGJhYnlncmFwaCwgdiA9IFYoYmFieWdyYXBoKSwgZGlyZWN0ZWQgPSBGQUxTRSwgd2VpZ2h0cyA9IEUoYmFieWdyYXBoKSR3ZWlnaHQsIG5vcm1hbGl6ZWQgPSBUUlVFKSkKICAjYWRkIG5vcm1hbGl6ZWReCiMgIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzW2ksMTddID0gZWRnZV9iZXR3ZWVubmVzcyhiYWJ5Z3JhcGgsIGUgPSBFKGJhYnlncmFwaCksIGRpcmVjdGVkID0gRkFMU0UsIHdlaWdodHMgPSBFKGJhYnlncmFwaCkkd2VpZ2h0KSkKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDE5XSA9IG1lYW4oZWRnZV9iZXR3ZWVubmVzcyhiYWJ5Z3JhcGgsIGUgPSBFKGJhYnlncmFwaCksIGRpcmVjdGVkID0gRkFMU0UsIHdlaWdodHMgPSBFKGJhYnlncmFwaCkkd2VpZ2h0KSkKICAjIEdsb2JhbCBjbHVzdGVyaW5nIGNvZWZmaWNpZW50CiAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwyMF0gPSB0cmFuc2l0aXZpdHkoYmFieWdyYXBoKQogICMgQXZlcmFnZSBjbHVzdGVyaW5nIGNvZWZmaWNpZW50CiAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwyMV0gPSB0cmFuc2l0aXZpdHkoYmFieWdyYXBoLCB0eXBlID0gImF2ZXJhZ2UiKQogICMgVGhlIHNhbWUgYXMgYWJvdmUKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDIyXSA9IG1lYW4odHJhbnNpdGl2aXR5KGJhYnlncmFwaCwgdHlwZSA9ICJsb2NhbCIpLCBuYS5ybSA9IFRSVUUpCiAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwyM10gPSBtZWFuKHRyYW5zaXRpdml0eShiYWJ5Z3JhcGgsIHR5cGUgPSAiYmFycmF0IiksIG5hLnJtID0gVFJVRSkKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDI0XSA9IG1lZGlhbihkZWdyZWUoYmFieWdyYXBoLCB2ID0gVihiYWJ5Z3JhcGgpLCBsb29wcyA9IEZBTFNFLCBub3JtYWxpemVkID0gVFJVRSkpCiAgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXNbaSwyNV0gPSBtZWRpYW4oZGVncmVlKGJhYnlncmFwaCwgdiA9IFYoYmFieWdyYXBoKSwgbG9vcHMgPSBGQUxTRSwgbm9ybWFsaXplZCA9IEZBTFNFKSkKICBncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1tpLDI2XSA9IGdvcmRlcihiYWJ5Z3JhcGgpCgogIAogIHJvd25hbWVzKGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzKVtpXT1yb3duYW1lcyhPYmplY3RzX3N0dWR5X2JhYmllcylbaV0KCn0KYGBgCgpgYGB7cn0KZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXMgIyBiZWZvcmUgc2ltcGxpZnkKYGBgCmBgYHtyfQpncmFwaF9wYXJhbWV0ZXJzX2JhYmllcyAjIGFmdGVyIHNpbXBsaWZ5CgpgYGAKCmBgYHtyfQpncmFwaF9wYXJhbWV0ZXJzX2JhYmllcwp3cml0ZS5jc3YoZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXMsZmlsZSA9ICJJbmRpdmlkdWFsR3JhcGhQYXJhbWV0ZXJzLmNzdiIpCnk9YXMubWF0cml4KGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzKQpjb2xuYW1lcyh5KT1jKDE6MjYpCnJvd25hbWVzKHkpPWMoMToxNCkKd3JpdGUuY3N2KHksZmlsZSA9ICJJbmRpdmlkdWFsR3JhcGhQYXJhbWV0ZXJzX25vTGFiZWxzLmNzdiIpCmBgYAoKYGBge3J9CmJhYnkgPSBjb2xuYW1lcyhPYmplY3RzX3N0dWR5X2JhYmllcylbYXMubG9naWNhbChPYmplY3RzX3N0dWR5X2JhYmllc1s4LF0pXQogIGJhYnkgPSBzb3J0KGJhYnkpCiAgYmFieXN1YnNldCA9IENDW3Jvd25hbWVzKENDKSVpbiViYWJ5LGNvbG5hbWVzKENDKSVpbiViYWJ5XQogIGJhYnltYXRyaXggPSBhcy5tYXRyaXgoYmFieXN1YnNldCkKICBiYWJ5Z3JhcGggPSBncmFwaF9mcm9tX2FkamFjZW5jeV9tYXRyaXgoYmFieW1hdHJpeCwgd2VpZ2h0ZWQ9VFJVRSwgbW9kZT0icGx1cyIpCiAgYmFieWdyYXBoPXNpbXBsaWZ5KGJhYnlncmFwaCwgcmVtb3ZlLm11bHRpcGxlID0gVFJVRSwgcmVtb3ZlLmxvb3BzID0gVFJVRSwgZWRnZS5hdHRyLmNvbWIgPSBpZ3JhcGhfb3B0KCJlZGdlLmF0dHIuY29tYiIpKQogIAp4PWRpc3RhbmNlcyhiYWJ5Z3JhcGgpCnhbaXMuaW5maW5pdGUoeCldPU5BCm1lYW4oeCwgbmEucm0gPSBUUlVFKQpncmFwaF9wYXJhbWV0ZXJzX2JhYmllc1s4LDddID0gbWVhbih4LCBuYS5ybSA9IFRSVUUpCmdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzCmBgYAoKYGBge3J9CiMgZGVhbGluZyB3aXRoIEluZgpBW2lzLmluZmluaXRlKEEpXTwtTkEKcm93U3VtcyhBLG5hLnJtPVRSVUUpCgpgYGAKCgpgYGB7cn0KWydlZGdlX2RlbnNpdHknLCAnZWRnZV9jb25uZWN0aXZpdHknLCAnbWVhbl9lY2NlbnRyaWNpdHknLCAnbWVhbl9kaXZlcnNpdHknLCAnbWVhbl9wYXRoX2xlbmd0aCcsICdkaXN0YW5jZScsICdtZWFuX2Rpc3RhbmNlJywgJ25vcm1hbGl6ZWRfbWVhbl9kZWdyZWUnLCAnbWVhbl9kZWdyZWUnLCAndmVydGV4X2Nvbm5lY3Rpdml0eScsICdjb2hlc2lvbicsICdtZWFuX2NvY2l0YXRpb24nLCAnbWVhbl9zdHJlbmd0aCcsICdjb21wb25lbnRfY291bnQnLCAnbm9ybWFsaXplZF9tZWFuX2Nsb3NlbmVzcycsICdtZWFuX2Nsb3NlbmVzcycsICdtZWFuX3ZlcnRleF9iZXR3ZWVubmVzcycsICdub3JtYWxpemVkX21lYW5fdmVydGV4X2JldHdlZW5uZXNzJywgJ21lYW5fZWRnZV9iZXR3ZWVubmVzcycsICdnbG9iYWxfY2x1c3RlcmluZ19jb2VmZmljaWVudCcsICdhdmdfY2x1c3RlcmluZ19jb2VmZmljaWVudCcsICdsb2NhbF9jbHVzdGVyaW5nX2NvZWZmaWNpZW50JywgJ3dlaWdodGVkX2NsdXN0ZXJpbmdfY29lZmZpY2llbnQnLCAnbm9ybWFsaXplZF9tZWRpYW5fZGVncmVlJywgJ21lZGlhbl9kZWdyZWUnLCAnbnVtYmVyX29mX3dvcmRzJ10KYGBgCgoKYGBge3J9CiAgYmFieSA9IGNvbG5hbWVzKE9iamVjdHNfc3R1ZHlfYmFiaWVzKVthcy5sb2dpY2FsKE9iamVjdHNfc3R1ZHlfYmFiaWVzWzgsXSldCiAgYmFieSA9IHNvcnQoYmFieSkKICBiYWJ5c3Vic2V0ID0gQ0Nbcm93bmFtZXMoQ0MpJWluJWJhYnkscm93bmFtZXMoQ0MpJWluJWJhYnldCiAgYmFieW1hdHJpeCA9IGFzLm1hdHJpeChiYWJ5c3Vic2V0KQogIGJhYnlncmFwaCA9IGdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeChiYWJ5bWF0cml4LCB3ZWlnaHRlZD1UUlVFLCBtb2RlPSJwbHVzIikKICBiYWJ5Z3JhcGg9c2ltcGxpZnkoYmFieWdyYXBoLCByZW1vdmUubXVsdGlwbGUgPSBGQUxTRSwgcmVtb3ZlLmxvb3BzID0gVFJVRSwgZWRnZS5hdHRyLmNvbWIgPSBpZ3JhcGhfb3B0KCJlZGdlLmF0dHIuY29tYiIpKQpgYGAKCmBgYHtyfQpwbG90KHZvY2FiX3N0dWR5YmFiaWVzLCBncmFwaF9wYXJhbWV0ZXJzX2JhYmllcyRtZWRpYW5fZGVncmVlLHR5cGUgPSAicCIpCnBsb3Qodm9jYWJfc3R1ZHliYWJpZXMsIGdyYXBoX3BhcmFtZXRlcnNfYmFiaWVzJG1lYW5fZGlzdGFuY2UsdHlwZSA9ICJwIikKcGxvdCh2b2NhYl9zdHVkeWJhYmllcywgZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXMkbWVhbl9wYXRoX2xlbmd0aCx0eXBlID0gInAiKQpwbG90KHZvY2FiX3N0dWR5YmFiaWVzLCBncmFwaF9wYXJhbWV0ZXJzX2JhYmllcyRhdmdfY2x1c3RlcmluZ19jb2VmZmljaWVudCx0eXBlID0gInAiKQpwbG90KHZvY2FiX3N0dWR5YmFiaWVzLCBncmFwaF9wYXJhbWV0ZXJzX2JhYmllcyRnbG9iYWxfY2x1c3RlcmluZ19jb2VmZmljaWVudCx0eXBlID0gInAiKQoKYGBgCgpgYGB7cn0KbGlicmFyeSgiZ2dwdWJyIikKCmBgYAoKYGBge3J9CgpteV9kYXRhID0gZGF0YS5mcmFtZSh2b2NhYiA9IHZvY2FiX3N0dWR5YmFiaWVzLCBuZXR3b3JrX3NpemUgPSBncmFwaF9wYXJhbWV0ZXJzX2JhYmllcyRudW1iZXJfb2Zfd29yZHMsIG1lZGlhbl9kZWdyZWUgPSBncmFwaF9wYXJhbWV0ZXJzX2JhYmllcyRtZWRpYW5fZGVncmVlLCBub3JtYWxpemVkX21lZGlhbl9kZWdyZWUgPSBncmFwaF9wYXJhbWV0ZXJzX2JhYmllcyRub3JtYWxpemVkX21lZGlhbl9kZWdyZWUgLG1lYW5fd2VpZ2h0ZWRfZGlzdGFuY2UgPSBncmFwaF9wYXJhbWV0ZXJzX2JhYmllcyRtZWFuX2Rpc3RhbmNlLCBtZWFuX3BhdGhfbGVuZ3RoID0gZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXMkbWVhbl9wYXRoX2xlbmd0aCwgYXZlcmFnZV9jbHVzdGVyaW5nX2NvZWZmaWNpZW50ID0gZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXMkYXZnX2NsdXN0ZXJpbmdfY29lZmZpY2llbnQsIGdsb2JhbF9jbHVzdGVyaW5nX2NvZWZmaWNpZW50ID0gZ3JhcGhfcGFyYW1ldGVyc19iYWJpZXMkZ2xvYmFsX2NsdXN0ZXJpbmdfY29lZmZpY2llbnQgKQpteV9kYXRhJHZvY2FiWzEzOjE0XSA9IGMoMjcsNSkKcm93bmFtZXMobXlfZGF0YSlbMTM6MTRdID0gYygnU0QxMzknLCdTRDE0MScpCmBgYCAKCmBgYHtyfQp2WG1kID0gZ2dzY2F0dGVyKG15X2RhdGEsIHggPSAidm9jYWIiLCB5ID0gIm1lZGlhbl9kZWdyZWUiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAic3BlYXJtYW4iLAogICAgICAgICAgeGxhYiA9ICJWb2NhYnVsYXJ5IFNpemUgKCMgb2Ygd29yZHMpIiwgeWxhYiA9ICJNZWRpYW4gRGVncmVlIikKYGBgCgpgYGB7cn0KdlhubWQgPSBnZ3NjYXR0ZXIobXlfZGF0YSwgeCA9ICJ2b2NhYiIsIHkgPSAibm9ybWFsaXplZF9tZWRpYW5fZGVncmVlIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInNwZWFybWFuIiwKICAgICAgICAgIHhsYWIgPSAiVm9jYWJ1bGFyeSBTaXplICgjIG9mIHdvcmRzKSIsIHlsYWIgPSAiTm9ybWFsaXplZCBNZWRpYW4gRGVncmVlIiwgdGl0bGUgPSAnQ29ycmVsYXRpbmcgTWVkaWFuIERlZ3JlZSB3aXRoIFZvY2FidWxhcnkgU2l6ZScpCmBgYAoKCmBgYHtyfQp2WG13ZCA9IGdnc2NhdHRlcihteV9kYXRhLCB4ID0gInZvY2FiIiwgeSA9ICJtZWFuX3dlaWdodGVkX2Rpc3RhbmNlIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInNwZWFybWFuIiwKICAgICAgICAgIHhsYWIgPSAiVm9jYWJ1bGFyeSBTaXplICgjIG9mIHdvcmRzKSIsIHlsYWIgPSAiTWVhbiBXZWlnaHRlZCBEaXN0YW5jZSBCZXR3ZWVuIFdvcmRzIikKYGBgCgpgYGB7cn0KdlhwbCA9IGdnc2NhdHRlcihteV9kYXRhLCB4ID0gInZvY2FiIiwgeSA9ICJtZWFuX3BhdGhfbGVuZ3RoIiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInNwZWFybWFuIiwKICAgICAgICAgIHhsYWIgPSAiVm9jYWJ1bGFyeSBTaXplICgjIG9mIHdvcmRzKSIsIHlsYWIgPSAiTWVhbiBQYXRoIExlbmd0aCBCZXR3ZWVuIFdvcmRzIikKYGBgCgpgYGB7cn0KdlhhY2MgPSBnZ3NjYXR0ZXIobXlfZGF0YSwgeCA9ICJ2b2NhYiIsIHkgPSAiYXZlcmFnZV9jbHVzdGVyaW5nX2NvZWZmaWNpZW50IiwgCiAgICAgICAgICBhZGQgPSAicmVnLmxpbmUiLCBjb25mLmludCA9IFRSVUUsIAogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLCBjb3IubWV0aG9kID0gInNwZWFybWFuIiwKICAgICAgICAgIHhsYWIgPSAiVm9jYWJ1bGFyeSBTaXplICgjIG9mIHdvcmRzKSIsIHlsYWIgPSAiQXZlcmFnZSBDbHVzdGVyaW5nIENvZWZmaWNpZW50IikKYGBgCgpgYGB7cn0KdlhnY2MgPSBnZ3NjYXR0ZXIobXlfZGF0YSwgeCA9ICJ2b2NhYiIsIHkgPSAiZ2xvYmFsX2NsdXN0ZXJpbmdfY29lZmZpY2llbnQiLCAKICAgICAgICAgIGFkZCA9ICJyZWcubGluZSIsIGNvbmYuaW50ID0gVFJVRSwgCiAgICAgICAgICBjb3IuY29lZiA9IFRSVUUsIGNvci5tZXRob2QgPSAic3BlYXJtYW4iLAogICAgICAgICAgeGxhYiA9ICJWb2NhYnVsYXJ5IFNpemUgKCMgb2Ygd29yZHMpIiwgeWxhYiA9ICJHbG9iYWwgQ2x1c3RlcmluZyBDb2VmZmljaWVudCIpCmBgYAoKYGBge3J9CmdnYXJyYW5nZSh2WG1kLCB2WHBsLCB2WGdjYywKICAgICAgICAgIGxhYmVscyA9IGMoIkEiLCAiQiIsICJDIiksCiAgICAgICAgICBuY29sID0gMywgbnJvdyA9IDEpCgpgYGAKCg==